// 滑动窗口
class Solution {
public:
    int totalFruit(vector<int>& fruits) {  
        int FruitType1_StartIndex = -1; // 种类1水果 摘取开始索引位置
        int FruitType2_StartIndex = -1; // 种类2水果 摘取开始索引位置

        int FruitType1_EndIndex = -1;   // 种类1水果 摘取结束索引位置
        int FruitType2_EndIndex = -1;   // 种类2水果 摘取结束索引位置

        int maxFruitsNum = 0;   // 水果摘取最大数目

        // 循环遍历最后摘取位置为 i 的水果，可摘取水果的最大数目。
        for(int i = 0; i < fruits.size(); ++i){
            // 如果当前摘取的水果 为种类1水果
            if(FruitType1_StartIndex >= 0 && fruits[i] == fruits[FruitType1_StartIndex]){
                FruitType1_EndIndex = i; // 更新种类1水果摘取结束索引位置
            
            // 如果当前摘取的水果 为种类2水果
            } else if (FruitType2_StartIndex >= 0 && fruits[i] == fruits[FruitType2_StartIndex]) { 
                FruitType2_EndIndex = i; // 更新种类2水果摘取结束索引位置

            // 如果当前摘取的水果为新类型（种类3） 且种类1水果后被摘取 种类2水果需要被替换
            } else if (FruitType1_EndIndex > FruitType2_EndIndex) {
                // 从种类2水果最后摘取位置后找到新摘取序列中种类1水果的开始位置
                for(int j = FruitType2_EndIndex + 1; j <= FruitType1_EndIndex; ++j){
                    if(fruits[j] == fruits[FruitType1_EndIndex]){
                        FruitType1_StartIndex = j;
                        break;
                    }
                }

                FruitType2_EndIndex = i;    // 更新种类2水果摘取结束索引位置
                FruitType2_StartIndex = i;  // 更新种类2水果摘取开始索引位置

            // 如果当前摘取的水果为新类型（种类3） 且种类2水果后被摘取 种类1水果需要被替换
            } else {
                // 从种类1水果最后摘取位置后找到新摘取序列中种类2水果的开始位置
                for(int j = FruitType1_EndIndex + 1; j <= FruitType2_EndIndex; ++j){
                    if(fruits[j] == fruits[FruitType2_EndIndex]){
                        FruitType2_StartIndex = j;
                        break;
                    }
                }

                FruitType1_EndIndex = i;    // 更新种类1水果摘取结束索引位置
                FruitType1_StartIndex = i;  // 更新种类1水果摘取开始索引位置
            }

            // 水果摘取最大数目
            maxFruitsNum = max(maxFruitsNum, i - max(min(FruitType1_StartIndex, FruitType2_StartIndex), 0) + 1) ;
            // cout << max(min(FruitType1_StartIndex, FruitType2_StartIndex), 0) <<  "," << i << endl;
        }

        return maxFruitsNum;
    }
};